/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.emp.solbrillante.sales.dao;

import java.sql.*;
import java.util.ArrayList;
import pe.emp.solbrillante.sales.bean.Producto;


/**
 *
 * @author TacbaranNew
 */
public class MySQLProductoDAO implements ProductoDAO{

     //coneccion ala base de datos
      String connectionUrl = "jdbc:mysql://localhost/prueba_entidadr?" +
                                   "user=adminsamaydev&password=123456";
    
    public ArrayList<Producto> queryAll() {
            ArrayList <Producto> productoList = new ArrayList<Producto>();
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            try {
            //1. Se registra el driver de la BD
            Driver myDriver = new com.mysql.jdbc.Driver();
            //2. Se abre la conexión

            conn = DriverManager.getConnection(connectionUrl);
            
            //3. Se ejecuta la sentencia SQL
            pstmt = conn.prepareStatement("SELECT idproducto , Nombre , Detalle , precio_unitario,cantidad_unidad_medida FROM PRODUCTO ");
            rs =  pstmt.executeQuery();
            
            //4. Se evalúan los resultados
            while (rs.next()){
                int id = rs.getInt("idproducto");
                String nombre = rs.getString("Nombre");
                String detalle = rs.getString("Detalle");
                String precio_unitario = rs.getString("precio_unitario");
                String cantidad_unidad_medida = rs.getString("cantidad_unidad_medida"); 
                
                
                Producto producto= new Producto();
                
                producto.setId(id);
                producto.setNombre(nombre);
                producto.setDetalle(detalle);
                producto.setPrecio_unitario( Float.parseFloat(precio_unitario));
                producto.setCantidad_unidad_medida( Float.parseFloat(cantidad_unidad_medida));

                productoList.add(producto);
            }            
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        } 

            return productoList;

    }

    public int insert(Producto producto, String unidades_paquete, String subtotal , int cantidad ) {
        int result =0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String calling;
        
        try {
            //1. Se registra el driver de la BD
            //Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            Driver myDriver = new com.mysql.jdbc.Driver();
            //2. Se abre la conexión
            conn = DriverManager.getConnection(connectionUrl);
            
            //3. Se ejecuta la sentencia SQL
            
            /* forma 1
            
            String SQLString = null;
            SQLString =
                    "INSERT INTO PRODUCTO( Nombre, Detalle, idunidad_medida_fk, precio_unitario, idtipo_producto_fk, idproveedor_fk, cantidad_unidad_medida, idpresentacion_fk) "
                    + "VALUES(?,?,?,?,?,?,?,?)";
            pstmt = conn.prepareStatement(SQLString);
           
            pstmt.setString(1, producto.getNombre());
            pstmt.setString(2, producto.getDetalle());
            pstmt.setInt(3, producto.getUnidad_medida().getId());
           //  pstmt.setDouble(4, producto.getUnidad_medida().getId());
            pstmt.setFloat(4, producto.getPrecio_unitario());
            pstmt.setInt(5, producto.getTipo_producto().getId());
            pstmt.setInt(6, producto.getProveedor().getId());
            pstmt.setFloat(7, producto.getCantidad_unidad_medida());
            pstmt.setInt(8, producto.getPresentacion().getId());
                    
            result =  pstmt.executeUpdate();
            
            //fin forma 1
            
            */
            
            //call sp_insertproductopaquete('VatiMix', ' detalle Mix', 2, 10, 1, 7, 1, 1 , 24 ,10 ,100);
   calling = "{call prueba_entidadr.sp_set_productopaquete('"+
                     producto.getNombre()+"','"+
                     producto.getDetalle()+"',"+
                     producto.getUnidad_medida().getId()+","+
                     producto.getPrecio_unitario()+","+
                     producto.getTipo_producto().getId()+","+
           producto.getProveedor().getId()+","+
           producto.getCantidad_unidad_medida()+","+
           producto.getPresentacion().getId()+",'"+
                             unidades_paquete+ "','"+
                                     subtotal+"',"+
                                     cantidad+
                      ")}";
            pstmt = conn.prepareStatement(calling);
            //pstmt = conn.prepareStatement("SELECT idproveedor, RUC , nombre , credito_otorgado  FROM PROVEEDOR ");
            
            result =  pstmt.executeUpdate();
            
            //4. Se evalúan los resultados
            if (result == 0){
                throw new Exception();
            }                       
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        } 
        return result;        
    }

    public int update(Producto c) {
        throw new UnsupportedOperationException("Not supported yet.");
    }


     public int update( Object[] fila) {
                 
           int result =0;
 
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            String calling;
 
            try {
                //1. Se registra el driver de la BD
                Driver myDriver = new com.mysql.jdbc.Driver();
                //2. Se abre la conexión
                conn = DriverManager.getConnection(connectionUrl);
                //3. Se ejecuta la sentencia SQL
               calling = "{call prueba_entidadr.sp_set_actulizaprodutopaquete("+
                           (int)fila[0] +",'"+
                        (String)fila[1] +"','"+
                        (String)fila[2] +"','"+
                        (String)fila[3] +"','"+
                        (String)fila[4] +"','"+
                        (String)fila[5] +"','"+
                        (String)fila[6] +"',"+
                           (int)fila[7] + 
                          ")}";
   
               pstmt = conn.prepareStatement(calling);
            result =  pstmt.executeUpdate();

                    //4. Se evalúan los resultados
                    if (result == 0){
                        throw new Exception();
                    }            
              
            } catch(Exception e){
                e.printStackTrace();
            }   finally {
                try { if (rs!= null) rs.close();}  catch(Exception e) {e.printStackTrace();}
                try { if (pstmt!= null) pstmt.close();}  catch(Exception e) {e.printStackTrace();}
                try { if (conn!= null) conn.close();}  catch(Exception e) {e.printStackTrace();}
            }   
            
            
            
            return result;
    }   
    
    
    
    public int delete(int idProducto)  {
             int result =0;
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
             String calling;
            
            
            try {
            //1. Se registra el driver de la BD
            Driver myDriver = new com.mysql.jdbc.Driver();
            //2. Se abre la conexión

            conn = DriverManager.getConnection(connectionUrl);
            
            //3. Se ejecuta la sentencia SQL
            calling = "{call prueba_entidadr.sp_deleteproducto("+ idProducto +")}";
            pstmt = conn.prepareStatement(calling);
            
            result =  pstmt.executeUpdate();
            
            //4. Se evalúan los resultados
            if (result == 0){
                throw new Exception();
            }
                    
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        } 

            return result;

    }

    public ArrayList<Producto> queryLikeName(String nombre) {
            ArrayList <Producto> productoList = new ArrayList<Producto>();
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            try {
                //1. Se registra el driver de la BD
                Driver myDriver = new com.mysql.jdbc.Driver();
                //2. Se abre la conexión
            
                conn = DriverManager.getConnection(connectionUrl);

                //3. Se ejecuta la sentencia SQL  
                
                
                //("SELECT idproducto , Nombre , Detalle , precio_unitario,cantidad_unidad_medida FROM PRODUCTO ");
                pstmt = conn.prepareStatement(
                       "SELECT idproducto as Id, Nombre, Detalle, precio_unitario, cantidad_unidad_medida "
                        + " FROM PRODUCTO "
                        + " WHERE Nombre LIKE ?");
                pstmt.setString(1, "%" + nombre + "%");
                rs =  pstmt.executeQuery();
            
                //4. Se evalúan los resultados
                int id = 0;
                String detalle=null;
                float precio_unitario=0; 
                float cantidad_unidad_medida=0; 
                
                Producto producto = null; 
                
                while (rs.next()){
                    id = rs.getInt("Id");
                    nombre = rs.getString("Nombre");
                    detalle = rs.getString("Detalle");
                    precio_unitario = rs.getFloat("precio_unitario");
                    cantidad_unidad_medida = (float) rs.getDouble("cantidad_unidad_medida");
                    
                producto= new Producto();
                
                producto.setId(id);
                producto.setNombre(nombre);
                producto.setDetalle(detalle);
                producto.setPrecio_unitario( precio_unitario);
                producto.setCantidad_unidad_medida( cantidad_unidad_medida);
  
                    productoList.add(producto);
                }
            } catch(Exception e){
                e.printStackTrace();
            }   finally {
                try { if (rs!= null) rs.close();}  catch(Exception e) {e.printStackTrace();}
                try { if (pstmt!= null) pstmt.close();}  catch(Exception e) {e.printStackTrace();}
                try { if (conn!= null) conn.close();}  catch(Exception e) {e.printStackTrace();}
            } 

        return productoList;
    }

   
    public ArrayList<Producto> queryAllDelProveedor(String nameProveedor) {
         throw new UnsupportedOperationException("Not supported yet.");
    }

    
    public ArrayList<Object> queryAllDetalle(int idproveedor) {
        
        
         
          ArrayList<Object> tabla   = new ArrayList<Object>();
         
      
         
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            String calling;
 
            try {
                //1. Se registra el driver de la BD
                Driver myDriver = new com.mysql.jdbc.Driver();
                //2. Se abre la conexión
            
                conn = DriverManager.getConnection(connectionUrl);

                //3. Se ejecuta la sentencia SQL  
                
            //3. Se ejecuta la sentencia SQL
               calling = "{call prueba_entidadr.sp_get_produtodetalle("+idproveedor+")}";
               pstmt = conn.prepareStatement(calling);
                rs =  pstmt.executeQuery();
            
                
                //4. Se evalúan los resultados
               while (rs.next()){
                
                   
                  int id = rs.getInt("Codigo");
                String producto = rs.getString("Producto");
                String proveedor = rs.getString("Proveedor");
                String tipo = rs.getString("Tipo");
                String por = rs.getString("Por");
                String stock_min = rs.getString("Stock_min");
                String stock_max = rs.getString("Stock_max");
                 int cantidad = rs.getInt("Cantidad");

                
                Object[] fila = new Object[8];
                                  
                                  fila[0] = id ;
                                  fila[1] = producto;
                                  fila[2] = proveedor;
                                  fila[3] = tipo;
                                  fila[4] = por;
                                  fila[5] = stock_min;
                                  fila[6] = stock_max;
                                  fila[7] = cantidad;

                         tabla.add(fila);
                         
                       }

               
              
            } catch(Exception e){
                e.printStackTrace();
            }   finally {
                try { if (rs!= null) rs.close();}  catch(Exception e) {e.printStackTrace();}
                try { if (pstmt!= null) pstmt.close();}  catch(Exception e) {e.printStackTrace();}
                try { if (conn!= null) conn.close();}  catch(Exception e) {e.printStackTrace();}
            }   
            
            
            
            return tabla;
    }

    

}
